フローティング アプリ バーをリストの上に配置する
ユーザーがアイテムのリストを見やすくするために、 ユーザーがリストを下にスクロールするときにアプリ バーを非表示にすることもできます。 これは、アプリが「背の高い」ものを表示する場合に特に当てはまります。 垂直方向のスペースを多く占めるアプリバー。
通常、アプリバーを作成するには、appBar
の財産Scaffold
ウィジェット。これにより、常に上に残る固定アプリバーが作成されます
のbody
のScaffold
。
アプリバーを別の場所から移動するScaffold
ウィジェットをCustomScrollView
アプリバーを作成できます
スクロールすると画面外にスクロールします
中に含まれるアイテムのリストCustomScrollView
。
このレシピでは、CustomScrollView
のリストを表示するには
ユーザーがスクロールすると画面外にスクロールするアプリバーが上部にあるアイテム
次の手順を使用してリストを下に移動します。
- を作成します
CustomScrollView
。 - 使用
SliverAppBar
フローティング アプリ バーを追加します。 - を使用してアイテムのリストを追加します
SliverList
。
CustomScrollView
1.フローティング アプリ バーを作成するには、アプリ バーをCustomScrollView
これにはアイテムのリストも含まれています。
これにより、アプリバーのスクロール位置と項目のリストが同期されます。
あなたは次のことを考えるかもしれませんCustomScrollView
ウィジェットとしてListView
さまざまな種類のスクロール可能なリストを組み合わせて使用できるようになります。
ウィジェットも一緒に。
に提供されるスクロール可能なリストとウィジェットCustomScrollView
として知られています細片。いくつかの種類があります
などの細片のSliverList
、SliverGridList
、 とSliverAppBar
。
実際、ListView
とGridView
ウィジェットはSliverList
とSliverGrid
スクロールを実装するウィジェット。
この例では、CustomScrollView
が含まれているSliverAppBar
そしてSliverList
。さらに、アプリバーを削除します
あなたが提供するものScaffold
ウィジェット。
Scaffold(
// No appBar property provided, only the body.
body: CustomScrollView(
// Add the app bar and list of items as slivers in the next steps.
slivers: <Widget>[]),
);
SliverAppBar
フローティングアプリバーを追加するには
2. 使用する次に、アプリバーをCustomScrollView
。
Flutter が提供するのは、SliverAppBar
ウィジェットは、
通常とよく似ていますAppBar
ウィジェット、
を使用しますSliverAppBar
タイトルを表示するには、
タブ、画像など。
しかしSliverAppBar
「フローティング」を作成する機能も提供します
ユーザーがリストを下にスクロールすると、画面外にスクロールするアプリ バー。
さらに、次のように設定できます。SliverAppBar
縮むことと
ユーザーがスクロールすると展開します。
この効果を作成するには:
- タイトルのみを表示するアプリバーから始めます。
- をセットする
floating
財産をtrue
。 これにより、ユーザーは次の場合にアプリ バーをすばやく表示できるようになります。 リストを上にスクロールします。 - 追加
flexibleSpace
利用可能なものを満たすウィジェットexpandedHeight
。
CustomScrollView(
slivers: [
// Add the app bar to the CustomScrollView.
const SliverAppBar(
// Provide a standard title.
title: Text(title),
// Allows the user to reveal the app bar if they begin scrolling
// back up the list of items.
floating: true,
// Display a placeholder widget to visualize the shrinking size.
flexibleSpace: Placeholder(),
// Make the initial height of the SliverAppBar larger than normal.
expandedHeight: 200,
),
],
)
SliverList
3. を使用してアイテムのリストを追加します。アプリバーが配置されたので、アイテムのリストをCustomScrollView
。次の 2 つのオプションがあります。SliverList
またはSliverGrid
。項目のリストを次々に表示する必要がある場合は、
使用SliverList
ウィジェット。
グリッド リストを表示する必要がある場合は、SliverGrid
ウィジェット。
のSliverList
とSliverGrid
ウィジェットは 1 つの必須パラメータを取ります:SliverChildDelegate
、リストを提供します
ウィジェットのSliverList
またSliverGrid
。
たとえば、SliverChildBuilderDelegate
スクロールすると遅延して構築される項目のリストを作成できます。
と同じようにListView.builder
ウィジェット。
// Next, create a SliverList
SliverList(
// Use a delegate to build items as they're scrolled on screen.
delegate: SliverChildBuilderDelegate(
// The builder function returns a ListTile with a title that
// displays the index of the current item.
(context, index) => ListTile(title: Text('Item #$index')),
// Builds 1000 ListTiles
childCount: 1000,
),
)
インタラクティブな例
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
const title = 'Floating App Bar';
return MaterialApp(
title: title,
home: Scaffold(
// No appbar provided to the Scaffold, only a body with a
// CustomScrollView.
body: CustomScrollView(
slivers: [
// Add the app bar to the CustomScrollView.
const SliverAppBar(
// Provide a standard title.
title: Text(title),
// Allows the user to reveal the app bar if they begin scrolling
// back up the list of items.
floating: true,
// Display a placeholder widget to visualize the shrinking size.
flexibleSpace: Placeholder(),
// Make the initial height of the SliverAppBar larger than normal.
expandedHeight: 200,
),
// Next, create a SliverList
SliverList(
// Use a delegate to build items as they're scrolled on screen.
delegate: SliverChildBuilderDelegate(
// The builder function returns a ListTile with a title that
// displays the index of the current item.
(context, index) => ListTile(title: Text('Item #$index')),
// Builds 1000 ListTiles
childCount: 1000,
),
),
],
),
),
);
}
}